package com.gupao.singleton.lazy;

public class LazyDoubleCheckSingleton {

    //volatile是防止编译器对代码进行优化，导致编译器在编译代码时出现排序不稳定的状况
    /**
     * 1、分配地址
     * 2、初始化对象
     * 3、将初始化对象指向分配的地址
     * 编译器在优化时会将1-2-3的顺序进行重排序，可能导致1-3-2，在多线程下可能因为顺序问题导致初始化了两个对象。
     * 使用volatile就会避免编译器优化
     */
    private static volatile LazyDoubleCheckSingleton lazyDoubleCheckSingleton = null;

    private LazyDoubleCheckSingleton(){}

    public static LazyDoubleCheckSingleton getInstance(){
        if(lazyDoubleCheckSingleton == null){
            //在if里使用synchronized就会避免线程数量大的情况下造成运行性能不佳的问题，但是只要使用synchronized就一定会影响到性能
            synchronized(LazyDoubleCheckSingleton.class){
                if(lazyDoubleCheckSingleton == null){
                    lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton();
                }
            }
        }
        return lazyDoubleCheckSingleton;
    }
}
